Laravel另外還提供了許多的測試方法,
測試多個使用者我們今天可能從API取得了多個使用者的資料,
譬如以下的情況
Route::get('/users', function () {
    return User::all();
});
我們在測試的時候可以寫成這樣
$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has(3)
             ->first(fn ($json) =>
                $json->where('id', 1)
                     ->where('name', '小魚')
                     ->missing('password')
                     ->etc()
             )
    );
has(3)表示有三個User,
其中我們要檢查第一筆資料(first),
id應該是 1,
name應該是 小魚,
不應該有password這個參數。
測試Model在Array裡面我們今天有一個API長這樣
Route::get('/users', function () {
    return [
        'meta' => [...],
        'users' => User::all(),
    ];
})
我們寫了一個測試如下:
$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
             ->has('users', 3)
             ->has('users.0', fn ($json) =>
                $json->where('id', 1)
                     ->where('name', '小魚')
                     ->missing('password')
                     ->etc()
             )
    );
表示我們預期會有一個meta參數,
然後使用者會有3個,
其中的第一個使用者,
id應該是 1,
name應該是 小魚,
不應該有password這個參數。
或是可以簡化成這樣,
少做一次動作,
也能達到同樣的結果:
$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
             ->has('users', 3, fn ($json) =>
                $json->where('id', 1)
                     ->where('name', '小魚')
                     ->missing('password')
                     ->etc()
             )
    );
測試參數的類型我們也可以用測試的方法來確認參數的類型是否吻合,
譬如這樣:
$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('id', 'integer')
         ->whereAllType([
            'users.0.name' => 'string',
            'meta' => 'array'
        ])
);
我們也可以用 | 或是 Array 來指定多種類型
$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('name', 'string|null')
         ->whereType('id', ['string', 'integer'])
);
這樣我們可以根據不同的需求,
靈活運用測試方法來達到我們的目的。